package com.wjw.java.map;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

/**
 * 1.Map接口和Collection接口并列存在,用于保存映射关系的数据：Key、Value
 * 2.Map中的Key、Value可以是任意类型数据,会封装到HashMap$Node对象中
 * 3.Map中的Key不允许重复,原因和HashSet一样;Value可以重复
 * 4.Map中的Key可以为Null,但只能有一个
 *   Map中的Value也可以为Null,可以有多个
 * 5.Key和Value之间存在单向一对一关系,通过key找到Value
 * 6.一对key、value是放在一个HashMap$Node对象中,又因为Node实现了Entry接口,
 * 有些书也说一对key、value就是一个Entry
 * 7.map.keySet();返回的是一个装有所有key的Set集合
 *   map.entrySet();返回的是一个装有所有entry的Set集合,每一个entry都有KV
 * --------------------------------------------------------------------
 * HashMap底层是：数组+链表+红黑树
 * new HashMap时,table的初始大小为16
 * threshold(临界值)为：12,当table中的元素个数 > 临界值时,就会扩容,扩容详情看Detail_HashSet代码
 * loadFactor(加载因子)为:0.75
 * --------------------------------------------------------------------
 * 调用put方法时,先根据key计算hash值,然后得到talbe表中的索引位置,
 * 如果该索引位置没有值,就插入,然后将key和value组成一个entry放到entrySet集合中
 * 之所以放到entrySet集合中,是为了方便遍历集合
 */
public class Map_ {
    public static void main(String[] args) {
        Map<String,String> map = new HashMap<>();
        map.put("no1","奥迪");
        map.put("no2","宝马");
        map.put("no1","奔驰");//此时key重复,会替换第一个元素:KV都会替换
        map.put("no3","奔驰");//value可以重复
        map.put(null,null);//key可以为null,但只能有一个
        map.put("no4",null);//value可以为null,可以有多个
        map.put("no5",null);//value可以为null,可以有多个
        System.out.println(map);

        //增强for遍历：先取出索引的key,然后根据key获取value
        Set<String> keys = map.keySet();
        for (String key : keys) {
            String value = map.get(key);
            System.out.println("key:"+key+",value:"+value);
        }
        System.out.println("---------------------------------");
        //使用迭代器遍历
        Iterator<String> it = keys.iterator();
        while (it.hasNext()){
            String key = it.next();
            String value = map.get(key);
            System.out.println("key:"+key+",value:"+value);
        }
        System.out.println("---------------------------------");
        //遍历entrySet,每一个entry都有KV
        Set<Map.Entry<String, String>> entries = map.entrySet();//获取entrySet集合,每一个Entry都有K V
        for (Map.Entry<String, String> entry : entries) {
            String key = entry.getKey();
            String value = entry.getValue();
            System.out.println("key:"+key+",value:"+value);
        }
    }
}
